#include <iostream>
#include <string>

/**
1. 提供一个抽象主题角色: 真实主题与代理主题的共同接口。
2. 提供一个真实主题角色: 定义了代理角色所代表的真实对象
3. 提供一个代理主题角色: 含有对真实主题角色的引用
 */
class AbstractSubject { 
public:
    virtual void buyTicket() = 0;
};

class User : public AbstractSubject { 
public:
    virtual void buyTicket() {
        std::cout << "User buy ticket" << std::endl;
    }
};

class CtripProxy : public AbstractSubject { 
public:
    CtripProxy(AbstractSubject* user) {
        m_user = user;
    }

    virtual void buyTicket() {
        std::cout << "CtripProxy buy ticket" << std::endl;
        //视频里没下面这句话，但是ChatGpt里加上了
        //我觉着加上这句话更符合代理模式的理念
        m_user->buyTicket();
    }

private:
    AbstractSubject* m_user;

};

int main(int argc, char* argv[]) {
    AbstractSubject* user = new User();
    AbstractSubject* proxy = new CtripProxy(user);
    proxy->buyTicket();
    delete user;
    delete proxy;
    return 0;
}